<?php

namespace App\Func;

use DOMDocument;
use SimpleXMLElement;

class XmlFunc
{
    /**
     * 将数组转换为XML（支持属性和嵌套结构）
     * @param array $data 要转换的数据
     * @param string|null $rootNode 根节点名称
     * @return string XML字符串
     */
    function arrayToXml(array $data, $rootNode = 'root') {
        $dom = new DOMDocument('1.0', 'utf-8');
        $dom->formatOutput = true;

        // 创建根节点
        $root = $dom->createElement($rootNode);
        $dom->appendChild($root);

        // 递归添加节点
        $addNodes = function($data, $parent) use (&$addNodes, $dom) {
            foreach ($data as $key => $value) {
                // 处理带属性的节点
                if (strpos($key, '@') === 0) {
                    continue; // 跳过属性标记
                }

                // 创建节点
                $node = is_array($value)
                    ? $dom->createElement($key)
                    : $dom->createElement($key, htmlspecialchars($value));

                $parent->appendChild($node);

                // 添加属性（如果存在）
                if (isset($value['@attributes'])) {
                    foreach ($value['@attributes'] as $attrName => $attrValue) {
                        $node->setAttribute($attrName, $attrValue);
                    }
                }

                // 处理嵌套结构
                if (is_array($value) && isset($value['@value'])) {
                    $textNode = $dom->createTextNode($value['@value']);
                    $node->appendChild($textNode);
                } elseif (is_array($value)) {
                    $addNodes($value, $node);
                }
            }
        };

        $addNodes($data, $root);
        return $dom->saveXML();
    }

    /**
     * 将XML转换为数组
     * @param string $xml XML字符串
     * @return array 解析后的数组
     */
    function xmlToArray($xml) {
        $dom = new DOMDocument();
        $dom->loadXML($xml);

        $nodeToArray = function($node) use (&$nodeToArray) {
            $result = [];

            // 处理节点属性
            if ($node->hasAttributes()) {
                $attributes = [];
                foreach ($node->attributes as $attr) {
                    $attributes[$attr->nodeName] = $attr->nodeValue;
                }
                $result['@attributes'] = $attributes;
            }

            // 处理节点值
            if ($node->childNodes->length == 1 && $node->firstChild->nodeType == XML_TEXT_NODE) {
                $result['@value'] = $node->nodeValue;
            } else {
                foreach ($node->childNodes as $childNode) {
                    if ($childNode->nodeType != XML_ELEMENT_NODE) continue;

                    // 处理同名节点
                    if (isset($result[$childNode->nodeName])) {
                        if (!is_array($result[$childNode->nodeName]) ||
                            !isset($result[$childNode->nodeName][0])) {
                            $result[$childNode->nodeName] = [$result[$childNode->nodeName]];
                        }
                        $result[$childNode->nodeName][] = $nodeToArray($childNode);
                    } else {
                        $result[$childNode->nodeName] = $nodeToArray($childNode);
                    }
                }
            }

            return $result;
        };

        return [$dom->documentElement->nodeName => $nodeToArray($dom->documentElement)];
    }

}